<?php
/*
CLASS DÙNG CHO CÁC CẤU HÌNH PHÂN QUYỀN VÀ KIỂM TRA PHÂN QUYỀN TRÊN 1 TRANG
- Creeated By: luc.vo@eiu.edu.vn
- Date Modified: 2013/07/02
- Version 1
- EIU
*/
	interface right_class_info
	{	
		/*
			Hàm dùng để lấy toàn bộ dòng trong table right_tbl
			Field AccScre là field nối giữa AccountID và ScreenID, 
				mục đích dùng để lấy quyền của 1 user-screen
		*/
		function getAllRightsList();
		
		/*
			Insert quyền vào trong table right_tbl
		*/
		function insertRight($UserID,$ScreenID,$Permission,$ModifiedBy);
		
		/*
			Update row của table right_tbl
		*/
		function updateRight($UserID,$ScreenID,$Permission,$ModifiedBy);
		
		/*
			lấy các thông tin cần thiết của 1 user dựa trên Email Account
			Các fields là `StaffID`,Path,UserType,FullName 
		*/
		function getUserInfoByEmail($Email);
		
		/*
			Lấy quyền của 1 User và 1 màn hình dựa vào tất cả 
			các group mà user này thuộc
		*/
		function getPermissionByPath($Path,$ScreenID);
		
		/*
			Kiểm tra một quyền được lấy từ DB của 1 User là 
			quyền gì Edit,insert,full,view hay restrict
			Permission: 0010,1000,...
		*/
		function checkPermission($Permission);		
		
		/*
			Từ account Email và Screen sẽ cho biết Account này có quyền gì
			Edit,Insert,...
		*/
		function getRightByAccountEmail($AccountEmail,$ScreenID);
		
		/*
			Lấy quyền của tất cả người dùng của 1 màn hình
			Input: ID của màn hình
			Output: Quyền của tất cả user trên màn hình đó
		*/
		function getAllUserRightsByScreenID($ScreenID);
		
		/*
			Lấy quyền của User đưa vào trên tất cả các màn hình
		*/
		function getAllScreenRightsByAccountEmail($AccountEmail);
		
	}
	
	class right_class implements right_class_info
	{
		function right_class()
		{
			@session_start(); 
			require_once('../../lib/'.'BaseDir.inc.htm');
			require_once(EIU_LIB.'DBCommon.class.htm');					
		}
		
		function getAllRightsList()
		{
			$oDB = new DBCommon();
			$conn =  $oDB->stl_openConn();
									
			$q = "
				SELECT AccountID,ScreenID,Permission,CONCAT(AccountID,ScreenID) AS AccScre
				FROM right_tbl				 
			";	
			//echo $q;
			$rs = $oDB->stl_db_select($q, $conn);
			
			$oDB->stl_closeConn($conn);
			
			if($rs)	return $rs;
			else return false;
		}
		
		function insertRight($UserID,$ScreenID,$Permission,$ModifiedBy)
		{
			$oDB = new DBCommon();
			$conn =  $oDB->stl_openConn();
			
			$q_insert = "
				INSERT INTO  `right_tbl` (
					`AccountID` ,
					`ScreenID` ,
					`Permission` ,
					`CreateDate` ,					
					`ModifiedBy`
					)
				VALUES (
					'".$UserID."',  '".$ScreenID."', b'".$Permission."',  CURRENT_TIMESTAMP, '".$ModifiedBy."'
				);
			";			
						
			//echo $q_insert;
			$rs_insert = $oDB->stl_db_select($q_insert, $conn);
		
			$oDB->stl_closeConn($conn);
		}
		
		function updateRight($UserID,$ScreenID,$Permission,$ModifiedBy)
		{
			$oDB = new DBCommon();
			$conn =  $oDB->stl_openConn();
		
			$q_update = "UPDATE `right_tbl` SET `Permission` = b'".$Permission."',								 
								`LastUpdate`= CURRENT_TIMESTAMP,`ModifiedBy`= '".$ModifiedBy."' 
						WHERE AccountID = '".$UserID."' AND `ScreenID` =".$ScreenID
						;
		
			$rs_update = $oDB->stl_db_change($q_update, $conn);
			//echo $q_update;
			$oDB->stl_closeConn($conn);
		}
		
		function getUserInfoByEmail($Email)
		{
			$oDB = new DBCommon();
			$conn =  $oDB->stl_openConn();
									
			$q = "
				SELECT `StaffID`,Path,UserType,FullName 
				FROM  `staff_tbl` 
				WHERE `SchoolEmail` LIKE '".$Email."'								 
			";	
			//echo $q;
			$rs = $oDB->stl_db_select($q, $conn);
			
			$oDB->stl_closeConn($conn);
			
			if($rs)	return $rs;
			else return false;
		}
		
		function getPermissionByPath($Path,$ScreenID)
		{
			$oDB = new DBCommon();
			$conn =  $oDB->stl_openConn();
									
			$q = "
				SELECT CONV(Permission,2,10) AS Permission
				FROM `right_tbl` 
				WHERE  LOCATE(`AccountID`,'".$Path."') > 0 AND `ScreenID` = '".$ScreenID."'								 
			";	
			//echo $q;
			$rePerms = $oDB->stl_db_select($q, $conn);
			
			$permision = 0;
	
			foreach($rePerms as $row)
			{
				$permision = $permision | ($row->{"Permission"});
				//print_r("Permission tung dong theo user group: ".$row->{"Permission"}); echo "<br/>";
			}
			//$permision = decbin($permision);
			
			$oDB->stl_closeConn($conn);
			
			if($rePerms)	return $permision;
			else return false;
		}
		
		function checkPermission($Permission)
		{	
			//echo $Permission."@";
			$fullPermision = 8;//1000
			$editPermision = 4;//0100
			$insertPermision = 2;//0010
			$viewPermision = 1;//0001				
			//$Permission = bindec($Permission);
			$Permission = $Permission;
			
			$result = "";
			
			if(($Permission & $fullPermision)>0) $result = "FULL"; 
			else if(($Permission & $editPermision)>0) $result = "EDIT"; 
			else if(($Permission & $insertPermision)>0) $result = "INSERT"; 			
			else if(($Permission & $viewPermision)>0) $result = "VIEW"; 
			else $result = "RESTRICT";
			//echo $Permission."-".$result."---";
			return $result;
			
		}
		
		function getRightByAccountEmail($AccountEmail,$ScreenID)
		{
			$userInfo = $this->getUserInfoByEmail($AccountEmail);
			$userName = $userInfo[0]->{"FullName"};
			$userID = $userInfo[0]->{"StaffID"};
			
			//Lấy path cho user
			//path này bao gồm: tất cả các group, và idUser. 
			//Dựa trên chuỗi này để lấy Permission
			$path = json_decode($userInfo[0]->{"Path"});
			$path[] = $userInfo[0]->{"StaffID"};
			$path = json_encode($path);	
			
			//Tính toán permision		
			$permision = $this->getPermissionByPath($path,$ScreenID);
			//$permision = bindec($permision);
			$checkRight = $this->checkPermission($permision);			
			return $checkRight;
		}
		
		function getAllUserRightsByScreenID($ScreenID)
		{
			$oDB = new DBCommon();
			$conn =  $oDB->stl_openConn();
									
			$q = "
				SELECT StaffID,Path,UserType,FullName,SchoolEmail,screen_tbl.ScreenID,CONV(Permission,2,10) AS Permission,ScreenName,ScreenDescription 
				FROM 
					`staff_tbl` LEFT JOIN 
									(
										SELECT Permission,ScreenID,AccountID
										FROM right_tbl
										WHERE ScreenID = '".$ScreenID."'
									) AS RightFilter ON staff_tbl.StaffID = RightFilter.AccountID
								LEFT JOIN screen_tbl ON RightFilter.ScreenID = screen_tbl.ScreenID
				ORDER BY UserType,SchoolEmail ASC
			";	
			
			$rePerms = $oDB->stl_db_select($q, $conn);			
			
			$oDB->stl_closeConn($conn);
			
			if($rePerms)	return $rePerms;
			else return false;
		}
		
		function getAllScreenRightsByAccountEmail($AccountEmail)
		{
			$oDB = new DBCommon();
			$conn =  $oDB->stl_openConn();
									
			$q = "
				SELECT StaffID,Path,UserType,FullName,SchoolEmail,screen_tbl.ScreenID,CONV(AccRight.Permission,2,10) AS Permission,ScreenName,ScreenDescription 
				FROM screen_tbl LEFT JOIN 
									(
										SELECT AccountID,ScreenID,Permission
										FROM right_tbl
										WHERE AccountID = '".$AccountEmail."'
									) AS AccRight ON screen_tbl.ScreenID = AccRight.ScreenID
								LEFT JOIN staff_tbl ON AccRight.AccountID = staff_tbl.StaffID
			";	
			//echo $q;
			$rePerms = $oDB->stl_db_select($q, $conn);			
			
			$oDB->stl_closeConn($conn);
			
			if($rePerms)	return $rePerms;
			else return false;
		}
	}

?>